package com.sinothk.cloud.mq.rabbit;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 消息提供方->路由->一至多个队列消息发布到交换器时，消息将拥有一个路由键（routing key），在消息创建时设定。通过队列路由键，可以把
 * 队列绑定到交换器上。消息到达交换器后，RabbitMQ 会将消息的路由键与队列的路由键进行匹配（针对不同的交换器有不同的路由规则）；
 *
 * 常用的交换器主要分为一下三种：
 *      fanout：如果交换器收到消息，将会广播到所有绑定的队列上
 *      direct：如果路由键完全匹配，消息就被投递到相应的队列
 *      topic：可以使来自不同源头的消息能够到达同一个队列。使用 topic 交换器时，可以使用通配符
 */
@Configuration
public class RabbitMqConfig {

    // 测试队列名称
    private String testQueueName = "test_queue";
    // 测试交换机名称
    private String testExchangeName = "test_exchange";
    // RoutingKey
    private String testRoutingKey = "test_routing_key";

//    /** 创建队列 */
//    @Bean
//    public Queue testQueue() {
//        return new Queue(testQueueName);
//    }
//
//    /** 创建交换机 */
//    @Bean
//    public DirectExchange testExchange() {
////      return  new FanoutExchange(testExchangeName); // fanout：如果交换器收到消息，将会广播到所有绑定的队列上
//      return  new DirectExchange(testExchangeName); // direct：如果路由键完全匹配，消息就被投递到相应的队列
////        return new TopicExchange(testExchangeName); // topic：可以使来自不同源头的消息能够到达同一个队列。使用 topic 交换器时，可以使用通配符
//    }
//    /** 通过routingKey把队列与交换机绑定起来 */
//    @Bean
//    public Binding testBinding() {
//        return BindingBuilder.bind(testQueue()).to(testExchange()).with(testRoutingKey);
//    }

    /** 创建队列 */
    @Bean
    public Queue imQueue() {
        return new Queue(RabbitMqQueue.IM);
    }

    /** 创建交换机 */
    @Bean
    public DirectExchange imExchange() {
//      return  new FanoutExchange(testExchangeName); // fanout：如果交换器收到消息，将会广播到所有绑定的队列上
        return  new DirectExchange(RabbitMqQueue.IM_EXCHANGE); // direct：如果路由键完全匹配，消息就被投递到相应的队列
//        return new TopicExchange(testExchangeName); // topic：可以使来自不同源头的消息能够到达同一个队列。使用 topic 交换器时，可以使用通配符
    }

    @Bean
    public Binding imBinding() {
        return BindingBuilder.bind(imQueue()).to(imExchange()).with(RabbitMqQueue.IM_KEY);
    }
}
